﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AccesoDatos.Manejador;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using AccesoDatos.Objetos;

namespace RMA.Pantallas
{
    public partial class frmRegistraOrden : Form
    {
        [DllImport("user32.dll")]
        static extern bool AnimateWindow(IntPtr hwnd, uint dwTime, uint dwFlags);

        public class WinApi
        {
            public static int GWL_EXSTYLE = -20;
            public static int WS_EX_LAYERED = 0x80000;
            public static int LWA_ALPHA = 0x2;
            [DllImport("user32")]
            public static extern int SetLayeredWindowAttributes(IntPtr hWnd, byte crey, byte alpha, int dwFlags);
            [DllImport("user32")]
            public static extern int GetLayeredWindowAttributes(IntPtr hWnd, byte crey, out byte alpha, int dwFlags);
            [DllImport("user32")]
            public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
            [DllImport("user32")]
            public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
        }
        void mkwndtrans(IntPtr hWnd, int num)
        {
            int oldWinStyle = WinApi.GetWindowLong(hWnd, WinApi.GWL_EXSTYLE);
            WinApi.SetWindowLong(hWnd, WinApi.GWL_EXSTYLE,
            num < 255 ? oldWinStyle | WinApi.WS_EX_LAYERED :
            oldWinStyle & WinApi.WS_EX_LAYERED);
            WinApi.SetLayeredWindowAttributes(hWnd, 0, (byte)num, WinApi.LWA_ALPHA);
        }
        enum AnimateWindowFlags : uint
        {
            AW_HOR_POSITIVE = 0x00000007,
            AW_HOR_NEGATIVE = 0x00000002,
            AW_VER_POSITIVE = 0x00000004,
            AW_VER_NEGATIVE = 0x00000008,
            AW_CENTER = 0x00000010,
            AW_HIDE = 0x00010000,
            AW_ACTIVATE = 0x00020000,
            AW_SLIDE = 0x00040000,
            AW_BLEND = 0x00080000
        }

        string strFolId = "";
        string strProId = "";
        string strPU = "";
        DateTime Fecha;
        byte[] DatoImagen = null;
        ToolTip tlpBtn = new ToolTip();

        string strCliente = "";
        public frmRegistraOrden()
        {
            InitializeComponent();
        }
        public frmRegistraOrden(string _folId, string _ProId, string _PU, DateTime _Fecha, string _Cliente)
        {
            strFolId = _folId;
            strProId = _ProId;
            strPU = _PU;
            Fecha = _Fecha;
            strCliente = _Cliente;
            InitializeComponent();
        }

        private void frmRegistraOrden_Load(object sender, EventArgs e)
        {
            this.BringToFront();
            tlpBtn.SetToolTip(btnGuardar, "Guarda Registro de RMA");
            tlpBtn.SetToolTip(btnCancelar, "Cancelar los cambios");
            tlpBtn.SetToolTip(btnCargar, "Carga Imagen de Anexo de Series");
            CargaInfoOrden();
        }
        public void CargaInfoOrden()
        {
            Manejador_OrdenServicio objOrden = new Manejador_OrdenServicio();
            DataTable dtInfoProducto = null;
            DataTable dtSeries = null;
            DataTable dtCliente = null;

            dtInfoProducto = objOrden.RegresaInfoProducto(strProId);
            dtCliente = objOrden.RegresaDatosCliente(strCliente);

            foreach (DataRow r in dtCliente.Rows)
            {
                txtCodigoCte.Text = r[0].ToString();
                txtNombreCte.Text = r[1].ToString();
                txtCiudad.Text = r[2].ToString();
                txtEdo.Text = r[3].ToString();
                txtCP.Text = r[4].ToString();
                txtContacto.Text = r[5].ToString();
                txtTelefono.Text = r[6].ToString();
                txtFax.Text = r[7].ToString();
                txtEmail.Text = r[8].ToString();

            }

            foreach (DataRow r in dtInfoProducto.Rows)
            {
                txtProId.Text = r[0].ToString();
                txtDesc.Text = r[1].ToString();
                if (r[2].ToString() == "USD")
                {
                    lblMoneda.Text = "DOLARES";
                }
                else
                {
                    lblMoneda.Text = "PESOS";
                }

            }
            
            txtFechaReg.Text = DateTime.Now.ToString();
            txtFolId.Text = strFolId;
            txtValorProd.Text = strPU.ToString();
            txtFechaFact.Text = Fecha.ToString();
            dtSeries = objOrden.RegresaSeries(strFolId, txtProId.Text);
            if (dtSeries.Rows.Count > 0)
            {
                cbSerie.DataSource = dtSeries;
                cbSerie.DisplayMember = "Serie";
                cbSerie.Visible = true;
                txtSerie.Visible = false;
            }
            else
            {
                txtSerie.Visible = true;
                cbSerie.Visible = false;
            }
        }

        private void cbAccesorios_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbAccesorios.SelectedItem.ToString().ToLower() == "detalles")
            {
                frmAccesorios frmA = new frmAccesorios();
                AnimateWindow(frmA.Handle, 250, (uint)AnimateWindowFlags.AW_CENTER);
                frmA.ShowDialog();
                if (frmA.LstAcc != null)
                {
                    lbxAccesorios.DataSource = frmA.LstAcc;
                    lbxAccesorios.DisplayMember = "Accesorio";
                }
                
            }
            else
            {
                lbxAccesorios.DataSource = null;
            }

        }

        private Image Redimensionar(Image Imagen, int Ancho, int Alto, int resolucion)
        {
            //Bitmap sera donde trabajaremos los cambios
            using (Bitmap imagenBitmap = new Bitmap(Ancho, Alto, PixelFormat.Format32bppRgb))
            {
            imagenBitmap.SetResolution(resolucion, resolucion);
            //Hacemos los cambios a ImagenBitmap usando a ImagenGraphics y la Imagen Original(Imagen)
            //ImagenBitmap se comporta como un objeto de referenciado
            using (Graphics imagenGraphics = Graphics.FromImage(imagenBitmap))
            {
            imagenGraphics.SmoothingMode = SmoothingMode.AntiAlias;
            imagenGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            imagenGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
            imagenGraphics.DrawImage(Imagen, new Rectangle(0, 0, Ancho, Alto), new Rectangle(0, 0, Imagen.Width, Imagen.Height), GraphicsUnit.Pixel);
            //todos los cambios hechos en imagenBitmap lo llevaremos un Image(Imagen) con nuevos datos a travez de un MemoryStream
            MemoryStream imagenMemoryStream = new MemoryStream();
            imagenBitmap.Save(imagenMemoryStream, ImageFormat.Jpeg);
            Imagen = Image.FromStream(imagenMemoryStream);
            }
            }
            return Imagen;
            }

            //la siguiente porcion de codigo en un metodo sobrecargado de Redimensionar solo contiene el calculo del nuevo ancho, alto y la resolucion, argumentos para realizar una llamada a private Image Redimensionar(Image Imagen, int Ancho, int Alto, int resolucion), es decir calcula los valores nuevos antes de realizar el verdadero cambio de tamaño de imagen

            private Image Redimensionar(Image image, int SizeHorizontalPercent, int SizeVerticalPercent)
            {
                //Obntenemos el ancho y el alto a partir del porcentaje de tamaño solicitado
                int anchoDestino = image.Width * SizeHorizontalPercent / 100;
                int altoDestino = image.Height * SizeVerticalPercent / 100;
                //Obtenemos la resolucion original
                int resolucion = Convert.ToInt32(image.HorizontalResolution);

                return this.Redimensionar(image, anchoDestino, altoDestino, resolucion);
            }
        private void btnCargar_Click(object sender, EventArgs e)
        {
            
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.InitialDirectory = "C:\\";
            openFileDialog.Filter = "Imagenes (JPEG,GIF,BMP,PNG,ICO)|*.jpg;*.jpeg;*.gif;*.bmp;*.png"; //formatos soportados
            openFileDialog.RestoreDirectory = true;
            openFileDialog.Title = "Seleccione Imagen";

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string dir = openFileDialog.FileName;
                Image image = Image.FromFile(dir);
                image = this.Redimensionar(image, 30, 30);
                image.Dispose();
                DatoImagen = ConvierteImagen(dir);
                lblAnexo.Text = Path.GetFileName(dir);
            }

        }
        private byte[] ConvierteImagen(string strdir)
        {
            string[] split = null;
            string nom = "";
            string NombreArchivo = "";
            FileStream fs = new FileStream(strdir, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            byte[] data = null;
            nom = Path.GetFileName(strdir);
            split = nom.Split('.');
            NombreArchivo = split[0].ToString();
            data = br.ReadBytes(int.Parse(br.BaseStream.Length.ToString()));

            return data;
        }
        public void GuardaOrdenServicio()
        {
            if (txtDescFalla.Text != "")
            {
                if (cbAccesorios.Text != "")
                {
                    if (cbSerie.DataSource != null || txtSerie.Text != "")
                    {
                        if (DatoImagen != null)
                        {
                            GuardaConImagen(DatoImagen);
                        }
                        else
                        {
                            MessageBox.Show("Es necesario Cargar el anexo de series", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        Guarda();
                    }
                }
                else
                {
                    MessageBox.Show("Defina los accesorios", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                
            }
            else
            {
                MessageBox.Show("Ingrese la Falla del Articulo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        public void Guarda()
        {
            clsCreaOrdenServicio objOrden = new clsCreaOrdenServicio();
            Manejador_OrdenServicio Man_Orden = new Manejador_OrdenServicio();
            int FolOrden = 0;
            string FolioRMA = "";
            bool GuardaAnexo = false;
            bool guardamov = false;
            objOrden = new clsCreaOrdenServicio();
            //PRINCIPAL//
            objOrden.Sucid = frmPrincipal.SucursalId;
            objOrden.FechaAlta = Convert.ToDateTime(txtFechaReg.Text).ToString("yyyy/MM/dd");
            objOrden.Factura = txtFolId.Text;
            //DETALLE//
            objOrden.Producto = txtProId.Text;
            if (cbSerie.DataSource != null)
            {
                objOrden.Serie = cbSerie.Text.ToString();
            }
            else
            {
                objOrden.Serie = txtSerie.Text;
            }
            objOrden.Observacion = txtObservaciones.Text;
            objOrden.Falla = txtDescFalla.Text;
            objOrden.Accesorios = "";
            objOrden.DescripcionDetalle = txtDesc.Text;
            objOrden.Valor = float.Parse(txtValorProd.Text);
            objOrden.ReporteSerie = "";
            if (cbAccesorios.Text.ToLower() == "completo")
            {
                objOrden.Condicion = true;
            }
            else
            {
                objOrden.Condicion = false;
            }
            //GUARDAR ORDEN
            try
            {
                FolOrden = Man_Orden.CreaOrdenServicio(objOrden);
                if (FolOrden.ToString().Length == 6)
                {
                    FolioRMA = "0" + FolOrden.ToString();
                }
                else
                {
                    FolioRMA = FolOrden.ToString();
                }
                guardamov = Man_Orden.GuardaMovimiento(FolioRMA, "Registro de Orden", "", txtDescFalla.Text, "10");
                if (lbxAccesorios.DataSource != null)
                {
                    GuardaAccesorios(FolioRMA);

                }
                MessageBox.Show("Orden de Servicio Generada: " + FolioRMA, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                TerminaOrden();
            }
            catch (Exception ex1)
            {

            }
        }
        public void GuardaConImagen(byte[] data)
        {
            clsCreaOrdenServicio objOrden = new clsCreaOrdenServicio();
            Manejador_OrdenServicio Man_Orden = new Manejador_OrdenServicio();
            int FolOrden = 0;
            string FolioRMA = "";
            bool GuardaAnexo = false;
            bool guardamov = false;
            objOrden = new clsCreaOrdenServicio();
            //PRINCIPAL//
            objOrden.Sucid = frmPrincipal.SucursalId;
            objOrden.FechaAlta = Convert.ToDateTime(txtFechaReg.Text).ToString("yyyy/MM/dd");
            objOrden.Factura = txtFolId.Text;
            //DETALLE//
            objOrden.Producto = txtProId.Text;
            if (cbSerie.DataSource != null)
            {
                objOrden.Serie = cbSerie.Text.ToString();
            }
            else
            {
                objOrden.Serie = txtSerie.Text;
            }
            objOrden.Observacion = txtObservaciones.Text;
            objOrden.Falla = txtDescFalla.Text;
            objOrden.Accesorios = "";
            objOrden.DescripcionDetalle = txtDesc.Text;
            objOrden.Valor = float.Parse(txtValorProd.Text);
            objOrden.ReporteSerie = "";
            if (cbAccesorios.Text.ToLower() == "completo")
            {
                objOrden.Condicion = true;
            }
            else
            {
                objOrden.Condicion = false;
            }
            //GUARDAR ORDEN
            try
            {
                FolOrden = Man_Orden.CreaOrdenServicio(objOrden);
                if (FolOrden.ToString().Length == 6)
                {
                    FolioRMA = "0" + FolOrden.ToString();
                }
                else
                {
                    FolioRMA = FolOrden.ToString();
                }

                GuardaAnexo = Man_Orden.GuardaAnexos(FolioRMA, data);
                guardamov = Man_Orden.GuardaMovimiento(FolioRMA, "Registro de Orden", frmPrincipal.IdUsr.ToString(), txtDescFalla.Text, "10");
                if (lbxAccesorios.DataSource != null)
                {
                    GuardaAccesorios(FolioRMA);
                }
                if (FolioRMA != "" && GuardaAnexo)
                {
                    MessageBox.Show("Orden de Servicio Generada: " + FolioRMA, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    frmReporteReposicion Rep = new frmReporteReposicion(FolioRMA, objOrden.Factura);
                    Rep.ShowDialog();
                    TerminaOrden();
                }
            }
            catch (Exception ex1)
            {
                MessageBox.Show(ex1.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public void GuardaAccesorios(string strFolio)
        {
            List<clsAccesorios> lstAccesorios = new List<clsAccesorios>();
            clsAccesorios objAcc = new clsAccesorios();
            Manejador_OrdenServicio objA = new Manejador_OrdenServicio();

            foreach (clsAccesorios s in lbxAccesorios.Items)
            {
                objAcc = new clsAccesorios();
                objAcc.Accesorio = s.Accesorio;
                lstAccesorios.Add(objAcc);
            }
            try
            {
                objA.GuardaAccesorios(lstAccesorios, strFolio);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public void TerminaOrden()
        {
            this.Close();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            btnGuardar.Enabled = false;
            GuardaOrdenServicio();
            btnGuardar.Enabled = true;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea Cancelar la orden de registro?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                this.Close();
            }
        }

            

            
        

       
    }
}
